package cn.bugstack.springframework.beans.factory.support;

import cn.bugstack.springframework.beans.BeansException;
import cn.bugstack.springframework.beans.factory.config.BeanDefinition;

/**
 * BeanDefinitionRegistry 是一个接口，它定义了关于 BeanDefinition 的注册、移除、查询等一系列的操作。
 * 基本所有 BeanFactory接口的实现类 都会实现BeanDefinitionRegistry接口，因为要对外提供BeanDefinition 的注册、移除、查询等一系列的操作。
 * 基本所有 BeanFactory接口的实现类 都默认会维护一张beanDefinitionMap表，并且实现BeanDefinitionRegistry接口对这张表进行操作。
 * beanDefinitionMap表的定义和维护是在DefaultListableBeanFactory中实现的，该最终的BeanFactory实现了BeanDefinitionRegistry接口。
 */
public interface BeanDefinitionRegistry {

    /**
     * 向注册表中注册 BeanDefinition
     *
     * @param beanName       Bean 名称
     * @param beanDefinition Bean 定义
     */
    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition);


    /**
     * 移除指定名称的bean定义。
     *
     * @param beanName 需要移除的bean的名称。
     * @throws BeansException 如果在移除bean定义时发生错误。
     */
    void removeBeanDefinition(String beanName) throws BeansException;
    /**
     * 使用Bean名称查询BeanDefinition
     *
     * @param beanName
     * @return
     * @throws BeansException
     */
    BeanDefinition getBeanDefinition(String beanName) throws BeansException;

    /**
     * 判断是否包含指定名称的BeanDefinition
     * @param beanName
     * @return
     */
    boolean containsBeanDefinition(String beanName);

    /**
     * Return the names of all beans defined in this registry.
     *
     * 返回注册表中所有的Bean名称
     */
    String[] getBeanDefinitionNames();


    /**
     * 获取当前注册的Bean定义的数量。
     *
     * @return 返回Bean定义的数量，类型为int。
     */
    int getBeanDefinitionCount();

    /**
     * 检查给定的Bean名称是否已被使用。
     *
     * @param beanName 待检查的Bean名称，类型为String。
     * @return 如果给定的Bean名称已被使用，则返回true；否则返回false。
     */
    boolean isBeanNameInUse(String beanName);
}
